<?php

/**
 * Poliza filter form.
 *
 * @package    Sanitas
 * @subpackage filter
 * @author     Jose Antonio Sánchez Bedoya
 * @version    SVN: $Id: sfDoctrineFormFilterTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class PolizaFormFilter extends BasePolizaFormFilter
{
  // Variable para controlar cuando utilizo el autocomplete para el nombre y cuando no
  protected $con_id = false;  
    
  public function configure()
  {
      $this->disableLocalCSRFProtection();
      //following code will remove fields from form
      unset($this->widgetSchema['created_at']);
      unset($this->widgetSchema['updated_at']);
      unset($this->widgetSchema['validated_at']);
      unset($this->widgetSchema['is_validated']);
      unset($this->widgetSchema['removed_at']);
      unset($this->widgetSchema['remove_it']);
      
      // Para añadir el nombre del cliente_id  
        
      $this->validatorSchema->setOption('allow_extra_fields', true);
      $this->setWidget('cliente_id',new sfWidgetFormFilterInput(array('with_empty' => false)));
      $this->setWidget('cliente_nombre', new sfWidgetFormInputText(array(), array('class' => 'lectura', 'size'=>'35px')));
        
      $idiomas = sfconfig::get('app_idiomas_list');
      array_unshift($idiomas, "");
      $this->setWidget('idioma', new sfWidgetFormChoice(array(
                                            'choices' => $idiomas,
                                      )));
      $this->setWidget('dni', new sfWidgetFormFilterInput(array('with_empty' => false)));
      
      // Rango de fechas renovacion
      $from_date = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $from_date->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $to_date = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $to_date->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $this->widgetSchema['fecha_renovacion'] = new sfWidgetFormFilterDate(array(
  			'from_date' => $from_date, 
  			'to_date' => $to_date, 
  			'with_empty' => false,
  	));
      // Rango de fechas alta
      $from_date1 = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $from_date1->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $to_date1 = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $to_date1->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $this->widgetSchema['fecha_alta'] = new sfWidgetFormFilterDate(array(
  			'from_date' => $from_date1, 
  			'to_date' => $to_date1, 
  			'with_empty' => false,
  	));
      
      // Rango de fechas estado
      $from_date2 = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $from_date2->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $to_date2 = new sfWidgetFormJQueryDate(array('culture' => sfContext::getInstance()->getUser()->getCulture(),'image' => '/images/calendar.gif',));
      $to_date2->getOption('date_widget')->setOption('format', '%day%/%month%/%year%');
      $this->widgetSchema['fecha_estado'] = new sfWidgetFormFilterDate(array(
  			'from_date' => $from_date2, 
  			'to_date' => $to_date2, 
  			'with_empty' => false,
  	));
      
      
      /* 
       * Establezco filtro listbox para el estado de la póliza
       */
      $estados = sfconfig::get('app_estados_list');
      array_unshift($estados, "");
      $this->setWidget('estado', new sfWidgetFormChoice(array(
                                            'choices' => $estados,                                            
                                      )));

      
      
      // Definicion de Validadores
      $this->setValidator('cliente_id', new sfValidatorPass(array('required' => false)));
      $this->setValidator('cliente_nombre', new sfValidatorPass(array('required' => false)));
      $this->setValidator('idioma', new sfValidatorPass(array('required' => false)));
      $this->setValidator('dni', new sfValidatorPass(array('required' => false)));
      
  }
  
  public function addDniColumnQuery(Doctrine_Query $query, $field, $values)
  {
    if (!is_array($values))
    {
      $values = array($values);
    }

    if (!count($values))
    {
      return;
    }
    $q = "%" . $values['text'] . "%";  
    $query
      ->andWhere($query->getRootAlias().'.id IN (SELECT u.poliza_id FROM PolizaContacto u WHERE u.contacto_id IN 
                            (SELECT c.id FROM Contacto c WHERE c.num_documento LIKE ?))',array($q));
  }
  
  public function addIdiomaColumnQuery(Doctrine_Query $query, $field, $values)
  {
    if (!is_array($values))
    {
      $values = array($values);
    }

    if (!count($values))
    {
      return;
    }
    
    if (strcmp($values[0], '0')==0) {
        return;
    }
    //Si el idioma es sinidioma comparo con NULL
    if (strcmp($values[0],'sinidioma') == 0){
      $query
      ->andWhere($query->getRootAlias().'.id IN (SELECT u1.poliza_id FROM PolizaContacto u1 WHERE u1.contacto_id IN 
                            (SELECT c1.id FROM Contacto c1 WHERE c1.idioma IS NULL OR c1.idioma LIKE 0))');
      return;
    }
    $q = "%" . $values[0] . "%";    
    $query
      ->andWhere($query->getRootAlias().'.id IN (SELECT u1.poliza_id FROM PolizaContacto u1 WHERE u1.contacto_id IN 
                            (SELECT c1.id FROM Contacto c1 WHERE c1.idioma LIKE ?))',array($q));
  }
  
  public function addClienteNombreColumnQuery(Doctrine_Query $query, $field, $values)
  {
    if (!is_array($values))
    {
      $values = array($values);
    }

    if (!count($values))
    {
      return;
    }
    // Si el nombre no lo he creado con autocomplete, lo busco por nombre o apellido
    // Si el id está relleno, lo buscaré por id y por tanto no crearé la sentencia SQL para el nombre y apellidos.
    if (!$this->con_id){
        $q = "%" . $values[0] . "%";
        $query
                ->andWhere($query->getRootAlias().'.id IN (SELECT u2.poliza_id FROM PolizaContacto u2 WHERE u2.contacto_id IN 
                            (SELECT c2.id FROM Contacto c2 WHERE c2.nombre LIKE ? OR c2.primer_apellido LIKE ? OR c2.segundo_apellido LIKE ? ))',array($q,$q,$q));
    }    
        
  }
  
  public function addClienteIdColumnQuery(Doctrine_Query $query, $field, $values)
  {
    if (!is_array($values))
    {
      $values = array($values);
    }

    if (!count($values))
    {
      return;
    }
    
    // Si no hay id no filtro por ese campo
    if ($values['text'] != '') {   
        $q = $values['text'];
        $query
            ->andWhere($query->getRootAlias().'.id IN (SELECT u3.poliza_id FROM PolizaContacto u3 WHERE u3.contacto_id IN 
                           (SELECT c3.id FROM Contacto c3 WHERE c3.id = ? ))',array($q));
        $this->con_id = true;
    }    
  }
  
  // Para que funcione el filtro con campos select
  // Si no cuando no escribo nada en el campo Estado, busca los que no tienen ninguno.  
  public function convertEstadoValue($value)
  {
    return $value != '0' ? $value : false;
  }
  
   /*
   * Hay que copiar este método de BasePolizaFormFilter y cambiar estado a ForeignKey para
   * que lo coja con un select en los filtros aplicados.
   */
  public function getFields()
  {
    return array(
      'id'               => 'Number',
      'poliza'           => 'Number',
      'colectivo'        => 'Number',
      'fecha_renovacion' => 'Date',
      'producto'         => 'Text',
      'fecha_alta'       => 'Date',
      'estado'           => 'ForeignKey',
      'fecha_estado'     => 'Date',
      'total_prima'      => 'Number',
      'frecuencia_pago'  => 'Text',
      'banco'            => 'Number',
      'sucursal'         => 'Number',
      'dc'               => 'Number',
      'cuenta'           => 'Number',
      'observaciones'    => 'Text',
      'created_at'       => 'Date',
      'updated_at'       => 'Date',
      'validated_at'     => 'Date',
      'is_validated'     => 'Boolean',
      'removed_at'       => 'Date',
      'remove_it'        => 'Boolean',
      'contactos_list'   => 'ManyKey',
    );
  }
  
}
